package com.example.langchain4j.service;

import com.example.langchain4j.common.Result;
import com.example.langchain4j.common.exception.BusinessException;
import com.example.langchain4j.remote.ChaiLiangApi;
import com.example.langchain4j.utils.DocumentUtils;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 裁量权基准处理服务
 * 调用第三方ChaiLiangApi获取裁量权建议
 */
@Slf4j
@Service
public class ChaiLiangProcessService {

    /**
     * 构建裁量权查询内容的提示词模板
     * 将完整的违法事实和案件信息发送给裁量权AI
     */
    private static final String BUILD_QUERY_PROMPT = """
            请根据以下消防执法案件信息，查询裁量权基准建议。

            ========== 立案审批表 ==========
            {{approvalContent}}

            ========== 询问笔录 ==========
            {{interrogationContent}}

            ========== 查询要求 ==========
            请根据上述案件的违法事实、违反的法律条款、案情描述等完整信息，给出：
            1. 适用的法律法规及具体条款
            2. 裁量权基准建议（从轻、一般、从重情节判断）
            3. 建议的行政处罚种类和幅度
            4. 相关法律依据和说明
            """;

    /**
     * 处理文件并调用裁量权基准API
     *
     * @param approvalFile 立案审批表文件
     * @param interrogationFile 询问笔录文件
     * @return 处理结果，包含裁量权基准建议
     */
    public Map<String, Object> processChaiLiangQuery(
            MultipartFile approvalFile,
            MultipartFile interrogationFile) {

        try {
            log.info("开始处理裁量权基准查询");

            // 1. 提取文档内容
            String approvalContent = extractFileContent(approvalFile, "立案审批表");
            String interrogationContent = extractFileContent(interrogationFile, "询问笔录");

            log.info("文档内容提取完成，立案审批表长度: {}, 询问笔录长度: {}",
                    approvalContent.length(), interrogationContent.length());

            // 2. 构建完整的查询内容（包含所有违法事实和案件信息）
            String queryContent = buildQueryContent(approvalContent, interrogationContent);
            log.info("构建的查询内容长度: {}", queryContent.length());

            // 3. 调用ChaiLiangApi获取裁量权基准建议
            String conversationId = UUID.randomUUID().toString();
            String user = "fire-case-system";

            log.info("调用ChaiLiangApi，conversationId: {}", conversationId);
            Result<String> apiResult = ChaiLiangApi.getContent(conversationId, user, queryContent);

            if (apiResult == null || !apiResult.isSuccess()) {
                throw new BusinessException(500, "调用裁量权基准API失败");
            }

            String chaiLiangAdvice = apiResult.getData();
            log.info("获取到裁量权建议，长度: {}", chaiLiangAdvice.length());

            // 4. 构建返回结果
            Map<String, Object> result = new HashMap<>();
            result.put("success", true);
            result.put("queryContent", queryContent);
            result.put("chaiLiangAdvice", chaiLiangAdvice);
            result.put("conversationId", conversationId);
            result.put("message", "裁量权基准查询成功");

            log.info("裁量权基准处理完成");
            return result;

        } catch (IOException e) {
            log.error("提取文档内容失败", e);
            throw new BusinessException(500, "提取文档内容失败: " + e.getMessage());
        } catch (Exception e) {
            log.error("处理裁量权基准查询失败", e);
            throw new BusinessException(500, "处理裁量权基准查询失败: " + e.getMessage());
        }
    }

    /**
     * 提取文件内容
     */
    private String extractFileContent(MultipartFile file, String fileType) throws IOException {
        if (file == null || file.isEmpty()) {
            throw new BusinessException(400, fileType + "文件不能为空");
        }

        String content = DocumentUtils.extractTextFromWord(file);

        if (content == null || content.trim().isEmpty()) {
            throw new BusinessException(400, fileType + "文件内容为空");
        }

        return content;
    }

    /**
     * 构建完整的裁量权查询内容
     * 直接将所有违法事实和案件信息发送给裁量权AI
     */
    private String buildQueryContent(String approvalContent, String interrogationContent) {
        // 使用PromptTemplate构建完整的查询内容
        PromptTemplate promptTemplate = PromptTemplate.from(BUILD_QUERY_PROMPT);

        HashMap<String, Object> variables = new HashMap<>();
        variables.put("approvalContent", approvalContent);
        variables.put("interrogationContent", interrogationContent);

        Prompt prompt = promptTemplate.apply(variables);

        // 直接返回构建好的完整内容，不调用千问模型
        return prompt.text();
    }
}
